#include "BarberShop.h"

#define MAX_AVALIABLE_CHAIR_QUANTITY    10

BarberShop::BarberShop(void)
:
m_pkMutex( new Mutex() ),
m_bBarberChairOccupied(false),
m_iAvailableChairCount(MAX_AVALIABLE_CHAIR_QUANTITY)
{
}

BarberShop::~BarberShop(void)
{
	
}

bool BarberShop::ExecuteQueryAndLock(unsigned int pQueryType)
{
	//se fija se el thread esta lockeado, si esta lockeado devuelve false, sino, lo lockea y devuelve true
	if (m_pkMutex->tryLock())
	{
		//TODO:EJECUTAR QUERYS
		switch(pQueryType)
		{
			case IS_BARBER_SEAT_OCCUPIED:
				 return IsBarberSeatOccupied();
			break;
			
			//el cliente pregunta si hay sillas libres para sentarse
			case IS_ANY_WAITING_SEAT_FREE:
				 return IsAnyWaitingSeatFree();
			break;
			//el barbero pregunta si hay clientes esperando
			case IS_ANY_CLIENT_WAITING:
				return IsAnyClientAvailable();
			break;
		}
	}
	
	m_pkMutex->unlock();

	return false;	
}

void BarberShop::OccupyBarberChair()
{
	m_bBarberChairOccupied = true;
}

void BarberShop::ReleaseCurrentClient()
{
	m_bBarberChairOccupied = false;
}

void BarberShop::AddClientToWaitList()
{
	m_iAvailableChairCount--;
}



//pregunta si la silla del Barber esta ocupada, o sea, si el barbero esta durmiendo
//si esta libre, la ocupa
bool BarberShop::IsBarberSeatOccupied()
{
	if (!m_bBarberChairOccupied)
	{
		m_bBarberChairOccupied = true;
	}

	return m_bBarberChairOccupied;
}

//pregunta si hay alguna silla de espera disponible
bool BarberShop::IsAnyWaitingSeatFree()
{
	if(m_iAvailableChairCount > 0)
	{
		m_iAvailableChairCount--;
	}
}

bool BarberShop::IsAnyClientAvailable()
{
	//si quedan 10 sillas disponibles es que la peluqueria esta vacia
	if (m_iAvailableChairCount < MAX_AVALIABLE_CHAIR_QUANTITY)
	{
		//como el barbero se lleva un cliente a la silla, hay 1 silla mas disponible
		m_iAvailableChairCount++;
		m_bBarberChairOccupied = true;
	}
}
